package org.common.utils.fury;

import io.fury.Fury;
import io.fury.config.Language;

/**
 * Fury 工具类，已废弃，主要用于线程变量，但FURY又不能采用使用完后清理（要不失去了缓存的意义），要缓存使用，所以弃用。建议使用FuryPool，会有时间检查有缓存时效性的缓存。
 * @author zhouzhibing
 * @date 2025/11/16 23:40
 */
@Deprecated
class FuryThreadLocalTool {

    /**
     * 全局注册的类
     */
//    private static final Class<?> [] GLOBAL_CLASS = {
//        byte.class, short.class, int.class, long.class, float.class, double.class,boolean.class, char.class,
//        Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class, Boolean.class, Character.class,
//        byte[].class, short[].class, int[].class, long[].class, float[].class, double[].class, boolean[].class, char[].class, String[].class,
//        ArrayList.class, LinkedList.class, HashSet.class, LinkedHashSet.class, TreeSet.class, HashMap.class, LinkedHashMap.class, TreeMap.class, ConcurrentHashMap.class
//    };


    // 使用 ThreadLocal 确保每个线程有独立的 Fury 实例
    private static final ThreadLocal<Fury> FURY_THREAD_LOCAL = ThreadLocal.withInitial(() -> {
        Fury fury = Fury.builder()
                .withLanguage(Language.JAVA)
                .withAsyncCompilation(true)            // 异步编译序列化器，提升启动性能
                .withCodegen(true)                     // 启用代码生成，大幅提升性能
                .withRefTracking(true)
                .withStringCompressed(true)             //字符串压缩
                .requireClassRegistration(false)        //关闭强制类注册
                .build();

//        for (Class<?> clazz : GLOBAL_CLASS) {
//            fury.register(clazz);
//        }
        return fury;
    });

    /**
     * 获取当前线程的 Fury 实例
     */
    public static Fury getFury() {
        return FURY_THREAD_LOCAL.get();
    }

    /**
     * 序列化对象
     */
    public static byte[] serialize(Object obj) {
        byte [] bytes = getFury().serialize(obj);
        FURY_THREAD_LOCAL.remove();
        return bytes;
    }

    /**
     * 反序列化对象
     */
    @SuppressWarnings("unchecked")
    public static <T> T deserialize(byte[] data) {
        return (T) getFury().deserialize(data);
    }

    /**
     * 清理当前线程的 Fury 实例
     */
    public static void clear() {
        FURY_THREAD_LOCAL.remove();
    }

    /**
     * 动态注册新类（线程安全）
     */
    public static void registerClass(Class<?> clazz) {
        Fury fury = getFury();
        fury.register(clazz);
    }
}
